package net.vmiranda.jeds.utils.busqueda;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

import net.vmiranda.jeds.utils.Cadena;

/**
 * Autentica chapuza vergonzosa
 * Hay que arreglarlo totalmente pero es pa poder empezar 
 * a hacer busquedas.
 * Hay grandes ideas al respecto
 * @author victor
 *
 */
public class JpaQueryGenerator {
	
	public static String generateJPQL(Object o,TipoOperacionJpa tipo){
		
		StringBuffer buf = new StringBuffer();
		
		ClaseBusqueda claseResultado = o.getClass().getAnnotation(ClaseBusqueda.class);
		String aliasOrigen = claseResultado.aliasOrigen();
		
		CampoConstructor[] camposConstructor = 
			o.getClass().getAnnotation(Constructor.class).campos();
		
		buf.append("SELECT");
		if(TipoOperacionJpa.SELECT == tipo){
			buf.append(" new "+claseResultado.claseResultado().getCanonicalName());
			buf.append("(");
			boolean primero = true;
			for(CampoConstructor cConst: camposConstructor){
				if(!primero){buf.append(",");}
				else{primero = false;}
				buf.append("\n\t"+cConst.alias()+"."+cConst.campo());
			}
			buf.append("\n)");
				
		}else{
			buf.append(" COUNT("+ aliasOrigen+") ");
		}
		Map<Class<?>,String> listaEntidades = new HashMap<Class<?>,String>();

		//Lectura de las tablas de los joins
		Join[] joins = claseResultado.joins();
		//pinto el FROM
		buf.append(" \nFROM \n\t");
		buf.append(claseResultado.claseOrigen().getSimpleName()+" "+aliasOrigen);
		boolean primerWhere = true;
		if(joins.length >0){
			for(Join join : joins){
				Class<?> clase = join.entidadDestino();
				listaEntidades.put(clase,join.aliasDestino());
				buf.append(",\n\t"+clase.getSimpleName()+" "+join.aliasDestino());
			}
		}

		Field[] campos = o.getClass().getDeclaredFields();
		if(joins.length > 0 || campos.length > 0){
			buf.append(" \nWHERE ");
		}
		if(joins.length >0){
			//enlazamos las tablas
			for(Join join : joins){
				if(primerWhere == true){primerWhere = false;}
				else{buf.append(" \n\tAND ");}
				
				buf.append(" "+aliasOrigen+"."+join.campoOrigen()+" = "+join.aliasDestino()+"."+join.campoDestino());
			}
		}

		
			//Itero sobre todos sus campos
		for(Field fCampo : campos) {
			Object valorCampo = null;
			
			
			try {
				fCampo.setAccessible(true);
				valorCampo = fCampo.get(o);
			} catch (IllegalArgumentException e) {
				
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				
				e.printStackTrace();
			}
			if(valorCampo instanceof String){
				String val = valorCampo.toString();
				if(!Cadena.isEmpty(val)){
					//Ahora toca leer la anotacion campoInforme
					CampoBusqueda campoBusqueda = fCampo.getAnnotation(CampoBusqueda.class);
					String alias = campoBusqueda.alias();
					String campo = campoBusqueda.campo();
					if(primerWhere == true){primerWhere = false;}
					else{buf.append("\n\tAND ");}
					buf.append(alias+"."+campo+" LIKE '%"+val+"%'");
					//System.out.println(entidad.toString()+" "+campo+ " "+val);
				}
			}	
		}
		System.out.println(buf.toString());
		return buf.toString();
	}

}
